home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / src / demos / REALITY / atom / light.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-02  |  9.4 KB  |  441 lines

  1. /*
  2.  * Copyright 1993, 1994, Silicon Graphics, Inc.
  3.  * All Rights Reserved.
  4.  *
  5.  * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
  6.  * the contents of this file may not be disclosed to third parties, copied or
  7.  * duplicated in any form, in whole or in part, without the prior written
  8.  * permission of Silicon Graphics, Inc.
  9.  *
  10.  * RESTRICTED RIGHTS LEGEND:
  11.  * Use, duplication or disclosure by the Government is subject to restrictions
  12.  * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
  13.  * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
  14.  * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
  15.  * rights reserved under the Copyright Laws of the United States.
  16.  */
  17. /* light.c
  18.  * -------
  19.  *
  20.  * $Revision: 1.16 $
  21.  *
  22.  */
  23.  
  24. #include <gl/gl.h>
  25.  
  26. #include "light.h"
  27.  
  28. /* material stuff */
  29.  
  30. static int CurMaterial = 0;
  31. static float *CurMatProp = 0;
  32.  
  33. float MatBrass[] = {
  34.     AMBIENT, 0.35, 0.25,  0.1,
  35.     DIFFUSE, 0.65, 0.5, 0.35,
  36.     SPECULAR, 0.0, 0.0, 0.0,
  37.     SHININESS, 5.0,
  38.     ALPHA, 0.2,
  39.     LMNULL
  40. };
  41.  
  42. float MatShinybrass[] = {
  43.     AMBIENT, 0.25, 0.15, 0.0,
  44.     DIFFUSE, 0.65, 0.5, 0.35,
  45.     SPECULAR, 0.9, 0.6, 0.0,
  46.     SHININESS, 10.0,
  47.     ALPHA, 0.2,
  48.     LMNULL
  49. };
  50.  
  51. float MatPewter[] = {
  52.     AMBIENT, 0.1, 0.1,  0.1,
  53.     DIFFUSE, 0.6, 0.55 , 0.65,
  54.     SPECULAR, 0.9, 0.9, 0.95,
  55.     SHININESS, 10.0,
  56.     ALPHA, 0.2,
  57.     LMNULL
  58. };
  59.  
  60. float MatSilver[] = {
  61.     AMBIENT, 0.4, 0.4,  0.4,
  62.     DIFFUSE, 0.3, 0.3, 0.3,
  63.     SPECULAR, 0.9, 0.9, 0.95,
  64.     SHININESS, 30.0,
  65.     ALPHA, 1.0,
  66.     LMNULL
  67. };
  68.  
  69. float MatGold[] = {
  70.     AMBIENT, 0.4, 0.2, 0.0,
  71.     DIFFUSE, 0.9, 0.5, 0.0,
  72.     SPECULAR, 0.7, 0.7, 0.0,
  73.     SHININESS, 10.0,
  74.     ALPHA, 0.2,
  75.     LMNULL
  76. };
  77.  
  78. float MatShinygold[] = {
  79.     AMBIENT, 0.4, 0.2,  0.0,
  80.     DIFFUSE, 0.9, 0.5, 0.0,
  81.     SPECULAR, 0.9, 0.9, 0.0,
  82.     SHININESS, 20.0,
  83.     ALPHA, 0.2,
  84.     LMNULL
  85. };
  86.  
  87. float MatPlaster[] = {
  88.     AMBIENT, 0.2, 0.2,  0.2,
  89.     DIFFUSE, 0.95, 0.95, 0.95,
  90.     SPECULAR, 0.0, 0.0, 0.0,
  91.     SHININESS, 1.0,
  92.     ALPHA, 0.2,
  93.     LMNULL
  94. };
  95.  
  96. float MatCyanplastic[] = {
  97.     AMBIENT, 0.0, 0.1, 0.06,
  98.     DIFFUSE, 0.0, 130.0/255, 130.0/255.0,
  99.     SPECULAR, 128.0/255.0, 128.0/255.0, 128.0/255.0,
  100.     SHININESS, 40.0,
  101.     ALPHA, 1.0,
  102.     LMNULL
  103. };
  104.  
  105. float MatWhiteplastic[] = {
  106.     AMBIENT, 0.0, 0.0, 0.0,
  107.     DIFFUSE, 0.55, 0.55, 0.55,
  108.     SPECULAR, 0.70, 0.70, 0.70,
  109.     SHININESS, 30.0,
  110.     ALPHA, 1.0,
  111.     LMNULL
  112. };
  113.  
  114. float MatGreyplastic[] = {
  115.     AMBIENT, 0.0, 0.0, 0.0,
  116.     DIFFUSE, 0.15, 0.15, 0.15,
  117.     SPECULAR, 0.60, 0.60, 0.60,
  118.     SHININESS, 30.0,
  119.     ALPHA, 1.0,
  120.     LMNULL
  121. };
  122.  
  123. float MatYellowplastic[] = {
  124.     AMBIENT, 0.0, 0.0, 0.0,
  125.     DIFFUSE,  0.5, 0.5, 0.0, 
  126.     SPECULAR, 0.6, 0.6, 0.5, 
  127.     SHININESS, 30.0,
  128.     ALPHA, 1.0,
  129.     LMNULL
  130. };
  131.  
  132. float MatRedplastic[] = {
  133.     AMBIENT, 0.0, 0.0, 0.0,
  134.     DIFFUSE, 0.5, 0.0, 0.0,
  135.     SPECULAR, 0.70, 0.60, 0.60,
  136.     SHININESS, 30.0,
  137.     ALPHA, 1.0,
  138.     LMNULL
  139. };
  140.  
  141. float MatGreenplastic[] = {
  142.     AMBIENT, 0.0, 0.0, 0.0,
  143.     DIFFUSE, 0.1, 0.35, 0.1,
  144.     SPECULAR, 0.45, 0.55, 0.45,
  145.     SHININESS, 30.0,
  146.     ALPHA, 1.0,
  147.     LMNULL
  148. };
  149.  
  150. float MatBlueplastic[] = {
  151.     AMBIENT, 0.0, 0.0, 0.0,
  152.     DIFFUSE, 0.12, 0.12, 0.35,
  153.     SPECULAR, 0.45, 0.45, 0.45,
  154.     SHININESS, 30.0,
  155.     ALPHA, 1.0,
  156.     LMNULL
  157. };
  158.  
  159. float MatPinkplastic[] = {
  160.     AMBIENT, 0.1, 0.0, 0.06, 
  161.     DIFFUSE, 120.0/255.0, 0.0, 50.0/255.0,
  162.     SPECULAR, 128.0/255.0, 128.0/255.0, 128.0/255.0,
  163.     SHININESS, 40.0,
  164.     ALPHA, 1.0,
  165.     LMNULL
  166. };
  167.  
  168. float MatLavpolstone[] = {
  169.     AMBIENT, 0.1,  0.0,  0.12, 
  170.     SPECULAR, 0.97, 0.59, 0.94, 
  171.     DIFFUSE,  0.33, 0.04, 0.37, 
  172.     EMISSION, 0.0, 0.0, 0.0, 
  173.     SHININESS, 54.65, 
  174.     ALPHA, 0.0, 
  175.     LMNULL
  176. };
  177.                
  178. float MatBrownpolstone[] = {
  179.     AMBIENT, 0.1, 0.1, 0.0, 
  180.     SPECULAR, 0.627, 0.627, 0.627, 
  181.     DIFFUSE,  0.208, 0.04, 0.0, 
  182.     EMISSION, 0.0, 0.0, 0.0, 
  183.     SHININESS, 60.0, 
  184.     ALPHA, 0.0, 
  185.     LMNULL
  186. };
  187.                
  188. float MatLapis[] = {
  189.     AMBIENT, 0.0,  0.0, 0.9, 
  190.     SPECULAR, 0.56, 0.54, 0.73, 
  191.     DIFFUSE,  0.01, 0.01, 0.18, 
  192.     EMISSION, 0.0, 0.0, 0.0, 
  193.     SHININESS, 44.06, 
  194.     ALPHA, 0.0, 
  195.     LMNULL
  196. };
  197.  
  198. float MatShinybronze[] = {
  199.     AMBIENT, 0.1,  0.0,  0.02, 
  200.     SPECULAR, 1.0, 0.545, 0.275, 
  201.     DIFFUSE,  0.30, 0.12, 0.06, 
  202.     EMISSION, 0.0, 0.0, 0.0, 
  203.     SHININESS, 70.0, 
  204.     ALPHA, 0.0, 
  205.     LMNULL
  206. };
  207.  
  208. float MatRedrubber[] = {
  209.     AMBIENT, 0.0,  0.0,  0.05, 
  210.     SPECULAR, 0.5, 0.5, 0.5, 
  211.     DIFFUSE,  0.7, 0.04, 0.05, 
  212.     EMISSION, 0.0, 0.0, 0.0, 
  213.     SHININESS, 10.0, 
  214.     ALPHA, 0.0, 
  215.     LMNULL
  216. };
  217.  
  218. float MatWall[] = {
  219.     AMBIENT, 0.4,  0.4,  0.4, 
  220.     SPECULAR, 0.1, 0.1, 0.1, 
  221.     DIFFUSE,  0.6, 0.6, 0.6, 
  222.     EMISSION, 0.0, 0.0, 0.0, 
  223.     SHININESS, 30.0, 
  224.     ALPHA, 0.0, 
  225.     LMNULL
  226. };
  227.  
  228. float MatGreenprops[] = {
  229.     DIFFUSE, 0.10, 0.35, 0.10,
  230.     LMNULL
  231. };
  232.  
  233. float MatRedprops[] = {
  234.     DIFFUSE, 0.5, 0.0, 0.0,
  235.     LMNULL
  236. };
  237.  
  238. float MatYellowprops[] = {
  239.     DIFFUSE, 0.5, 0.5, 0.0,
  240.     LMNULL
  241. };
  242.  
  243. float MatBlueprops[] = {
  244.     DIFFUSE, 0.12, 0.12, 0.35,
  245.     LMNULL
  246. };
  247.  
  248. float MatPinkprops[] = {
  249.     DIFFUSE, 120.0/255.0, 0.0, 50.0/255.0,
  250.     LMNULL
  251. };
  252.  
  253. float MatCyanprops[] = {
  254.     DIFFUSE, 0.0, 130.0/255, 130.0/255.0,
  255.     LMNULL
  256. };
  257.  
  258. float MatWhiteprops[] = {
  259.     DIFFUSE, 0.55, 0.55, 0.55,
  260.     LMNULL
  261. };
  262.  
  263. float MatGreyprops[] = {
  264.     DIFFUSE, 0.15, 0.15, 0.15,
  265.     LMNULL
  266. };
  267.  
  268. /* DefineMaterials() define material properties.
  269.  */               
  270. void DefineMaterials()
  271. {
  272.     lmdef(DEFMATERIAL, MAT_BRASS, 0, MatBrass);
  273.     lmdef(DEFMATERIAL, MAT_SHINYBRASS, 0, MatShinybrass);
  274.     lmdef(DEFMATERIAL, MAT_PEWTER, 0, MatPewter);
  275.     lmdef(DEFMATERIAL, MAT_SILVER, 0, MatSilver);
  276.     lmdef(DEFMATERIAL, MAT_GOLD, 0, MatGold);
  277.     lmdef(DEFMATERIAL, MAT_SHINYGOLD, 0, MatShinygold);
  278.     lmdef(DEFMATERIAL, MAT_PLASTER, 0, MatPlaster);
  279.     lmdef(DEFMATERIAL, MAT_REDPLASTIC, 0, MatRedplastic);
  280.     lmdef(DEFMATERIAL, MAT_GREENPLASTIC, 0, MatGreenplastic);
  281.     lmdef(DEFMATERIAL, MAT_BLUEPLASTIC, 0, MatBlueplastic);
  282.     lmdef(DEFMATERIAL, MAT_PINKPLASTIC, 0, MatPinkplastic);
  283.  
  284.     lmdef(DEFMATERIAL, MAT_GREYPLASTIC, 0, MatGreyplastic);
  285.     lmdef(DEFMATERIAL, MAT_WHITEPLASTIC, 0, MatWhiteplastic);
  286.     lmdef(DEFMATERIAL, MAT_YELLOWPLASTIC, 0, MatYellowplastic);
  287.     lmdef(DEFMATERIAL, MAT_CYANPLASTIC, 0, MatCyanplastic);
  288.  
  289.     lmdef(DEFMATERIAL, MAT_LAVPOLSTONE, 0, MatLavpolstone);
  290.     lmdef(DEFMATERIAL, MAT_BROWNPOLSTONE, 0, MatBrownpolstone);
  291.     lmdef(DEFMATERIAL, MAT_LAPIS, 0, MatLapis);
  292.     lmdef(DEFMATERIAL, MAT_SHINYBRONZE, 0, MatShinybronze);
  293.     lmdef(DEFMATERIAL, MAT_REDRUBBER, 0, MatRedrubber);
  294.     lmdef(DEFMATERIAL, MAT_WALL, 0, MatWall);
  295. }
  296.  
  297. void SetMaterial(new_mat)
  298.     int new_mat;
  299. {
  300.     if (new_mat == CurMaterial)        /* if material already picked        */
  301.     return;
  302.     CurMaterial = new_mat;
  303.     lmbind(MATERIAL, CurMaterial);
  304. }
  305.  
  306. void ChangeMaterial(new_property)
  307.     float *new_property;
  308. {
  309.     if (new_property == CurMatProp)
  310.     return;
  311.     CurMatProp = new_property;
  312.     lmdef(DEFMATERIAL, CurMaterial, 0, new_property);
  313. }
  314.  
  315. /* light source stuff */
  316.  
  317. typedef struct light_map {
  318.     int index;
  319.     int num;
  320. } LIGHT_MAP;
  321.  
  322. #define NUM_LIGHTS 6
  323. static LIGHT_MAP CurLight[NUM_LIGHTS] = {
  324.     {0, LIGHT1}, 
  325.     {0, LIGHT2}, 
  326.     {0, LIGHT3}, 
  327.     {0, LIGHT4}, 
  328.     {0, LIGHT5}, 
  329.     {0, LIGHT6}, 
  330. };
  331.  
  332. /* Initial lighting parameters */
  333. float DefaultLight[] = {
  334.     AMBIENT, 0.0, 0.0, 0.0, 
  335.     LCOLOR, 1.0, 1.0, 1.0, 
  336.     POSITION, 0.0, 0.0, 1.0, 0.0,
  337.     LMNULL
  338. };
  339.             
  340. float WhiteInfLight[] = {
  341.     AMBIENT, 0.0, 0.0, 0.0, 
  342.     LCOLOR,   0.70, 0.70, 0.70, 
  343.     POSITION, 50.0, -50.0, 50.0, 0.0, 
  344.     LMNULL
  345. };
  346.  
  347. float RedInfLight[] = {
  348.     AMBIENT, 0.0, 0.0, 0.0, 
  349.     LCOLOR,   0.5, 0.1, 0.1, 
  350.     POSITION, -100.0, 0.0, 50.0, 0.0, 
  351.     LMNULL
  352. };
  353.  
  354. float BlueInfLight[] = {
  355.     AMBIENT, 0.0, 0.0, 0.0, 
  356.     LCOLOR,   0.1, 0.1, 0.5, 
  357.     POSITION, 0.0, 0.0, 50.0, 0.0, 
  358.     LMNULL
  359. };
  360.  
  361. float GreenInfLight[] = {
  362.     AMBIENT, 0.0, 0.0, 0.0, 
  363.     LCOLOR,   0.1, 0.5, 0.1, 
  364.     POSITION, 100.0, 0.0, 50.0, 0.0, 
  365.     LMNULL
  366. };
  367.  
  368. float WhiteLocalLight[] = {
  369.     AMBIENT, 0.0, 0.0, 0.0, 
  370.     LCOLOR,   0.75, 0.75, 0.75, 
  371.     POSITION, 0.0, -50.0, 50.0, 1.0, 
  372.     LMNULL
  373. };
  374.  
  375. /* DefineLights() define lighting source.
  376.  */
  377. void DefineLights()
  378. {
  379.     lmdef(DEFLIGHT, LIGHT_DEFAULT, 0, DefaultLight);
  380.     lmdef(DEFLIGHT, LIGHT_WHITE_INF, 0, WhiteInfLight);
  381.     lmdef(DEFLIGHT, LIGHT_RED_INF, 0, RedInfLight);
  382.     lmdef(DEFLIGHT, LIGHT_BLUE_INF, 0, BlueInfLight);
  383.     lmdef(DEFLIGHT, LIGHT_GREEN_INF, 0, GreenInfLight);
  384.     lmdef(DEFLIGHT, LIGHT_WHITE_LOCAL, 0, WhiteLocalLight);
  385. }
  386.  
  387. void SetLight(new_light)
  388.     int new_light;
  389. {
  390.     LIGHT_MAP *light;
  391.  
  392.     for (light = CurLight; light < &CurLight[NUM_LIGHTS]; light++) {
  393.     if (new_light == light->index)    /* if light already picked        */
  394.     return;    
  395.     }
  396.     for (light = CurLight; light < &CurLight[NUM_LIGHTS]; light++) {
  397.     if (!light->index) {
  398.         light->index = new_light;
  399.         lmbind(light->num, light->index);
  400.         return;
  401.     }
  402.     }
  403. }
  404.  
  405. /* light model stuff */
  406.  
  407. static int CurLightModel = 0;
  408.  
  409. /* Initial lighting parameters */
  410.  
  411. float InfiniteModel[] = {
  412.     AMBIENT, 0.3,  0.3, 0.3, 
  413.     LOCALVIEWER, 0.0, 
  414.     LMNULL
  415. };
  416.  
  417. float LocalModel[] = {
  418.     AMBIENT, 0.3,  0.3, 0.3, 
  419.     LOCALVIEWER, 1.0, 
  420.     ATTENUATION, 1.0, 0.0, 
  421.     LMNULL
  422. };
  423.  
  424. /* DefineLightModels() define lighting model.
  425.  */
  426. void DefineLightModels()
  427. {
  428.     lmdef(DEFLMODEL, MODEL_INFINITE, 0, InfiniteModel);
  429.     lmdef(DEFLMODEL, MODEL_LOCAL, 0, LocalModel);
  430. }
  431.  
  432. void SetLightModel(new_model)
  433.     int new_model;
  434. {
  435.     if (new_model == CurLightModel)    /* if model already picked        */
  436.     return;
  437.     CurLightModel = new_model;
  438.     lmbind(LMODEL, CurLightModel);
  439. }
  440.  
  441.